package cn.kb05;

import java.util.ArrayList;

/*
 * @author
 * @Description   我的链表
 * @date
 * */
public class Mylink {
    private Entry link;   //链表
    private int size;      //记录链表的长度

    /**
     * 获取链表长度
     * @return
     */
    public int getSize() {
        return size;
    }

    /**
     * 清除所有链
     */
    public void clear(){
        size = 0;
        link = null;
    }

    /**
     *  向链表的尾部添加一环
     * @param key
     * @param value
     */

    public void add(Object key,Object value){
        //  造一个环
        Entry cpnow = new Entry(key,value);
        //  判断链表是否为空
        if(link==null){
            //  将建造出空环放在第一个位置
            link= cpnow;
        }else{
            //如果有n环了
            //先找最后一环
            Entry last=link;
            while (last.getNext()!=null){
                last = last.getNext();
            }
            //把最后一环的地址给空环的上一环地址
            cpnow .setPrev(last);
            //再把空环的地址赋值给最后一环的下一环地址
            last.setNext(cpnow);


            /** //（方法二）
            //把新环插入链表头部
            // 将空环的下一个环指向原第一环
            cpnow.setNext(link);
            //将原第一环的上一个环指向新环
            link.setPrev(cpnow);
            //将link指向第一环
            link=cpnow;*/

        }
        size++;

    }

    public void remove(int pos) throws NullPointerException{
        if(pos >= size){
            throw new NullPointerException("空指针异常");
        }

        if(pos==0){
            //删除首环
            //将首环的下一环的prev设置为null，并同时把link指向第二环
            link=link.getNext();
            link.setPrev(null);

        }else if(pos==size-1){
            // 删除尾环
            Entry last=indexOf(size-1);
            last.getNext().setPrev(null);

        }else{
           // 删除中间环
        Entry delEntry = indexOf(pos);
        //将删除环的上一环的next指向删除环的的next
        delEntry.getPrev().setNext(delEntry.getNext());
        // 将删除环的下一环的prev指向删除环的上一环
        delEntry.getNext().setPrev(delEntry.getPrev());
        }
       size--;
    }

    /**
     * 根据用户给的第pos环获得对应的Entry对象
     * @param pos
     * @return
     */
     public Entry indexOf(int pos) throws NullPointerException{
         if (pos>=size){
             throw new NullPointerException("越界");
         }
         Entry last=link;
         for (int i = 0; i <pos ; i++) {
             last = last.getNext();
         }
         return last;
     }

     public void set(int pos, Object key,Object value){
              //找到用户要替换的环
         Entry rep= indexOf(pos);
          // 生成你的新环
         Entry newEntry = new Entry(key,value);
         //将替换的上一环和下一环赋给新环的上一环和下一环
         newEntry.setPrev(rep.getPrev());
         newEntry.setNext(rep.getNext());
         //  将替换环的上一环的下一环设置为新环
         rep.getPrev().setNext(newEntry);
         //  将替换环的下一环的上一环设置为新环
         rep.getNext().setPrev(newEntry);
         //将替换环的上下环的设置为null
         rep.setPrev(null);
         rep.setNext(null);

     }

    /**
     * 此方法不是链表方法
     * @param key
     * @return
     */
    public Object get(Object key) {
        Object value = null;
        for (int i = 0; i < size; i++) {
            Entry tmp = indexOf(i);
            if (tmp.getKey()==key){
                return tmp.getValue();
            }
        }
     return null;
    }


    /**
     *   一 个环
     */
    private class Entry{
        private Entry prev;
        private Entry next;
        private Object key;
        private Object value;


        public Entry( Object key, Object value) {
            this.key = key;
            this.value = value;
        }

        public Entry getPrev() {
            return prev;
        }

        public void setPrev(Entry prev) {
            this.prev = prev;
        }

        public Entry getNext() {
            return next;
        }

        public void setNext(Entry next) {
            this.next = next;
        }

        public Object getKey() {
            return key;
        }

        public void setKey(Object key) {
            this.key = key;
        }

        public Object getValue() {
            return value;
        }

        public void setValue(Object value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return "Entry{" +
                    "value=" + value +
                    '}';
        }
    }
    public static void main(String[] args) {
        Mylink ml =new Mylink();
        ml.add(1,100);
        ml.add("aaa","1322");
        ml.add(2,"1322");
        ml.add("a",1322) ;
        ml.add("aaa",320);
        ml.add(3,300);

        System.out.println(ml);
    }
}
